package com.jahentao.testcase;


import org.junit.Assert;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Properties;
import java.util.logging.Logger;

/**
 * 生成测试用例的控制器
 * @author jahentao
 * @version 1.0
 * @updated 26-5月-2017 18:02:46
 */
public class GenerateTestCaseController {

    private  static final Logger logger = Logger.getLogger("GenerateTestCaseController");

    public InputOutputFormat m_InputOutputFormat;
    public TestCaseGenerateStrategy m_TestCaseGenerateStrategy;
	public CLITemplate m_CLITemplate;

    public GenerateTestCaseController(){

	}

	public GenerateTestCaseController(InputOutputFormat inputOutputFormat, TestCaseGenerateStrategy testCaseGenerateStrategy) {
		this.m_InputOutputFormat = inputOutputFormat;
		this.m_TestCaseGenerateStrategy = testCaseGenerateStrategy;
	}


	/**
	 * 生成测试用例
	 */
	public void generateTestCases(File sourceFile) throws Exception {
        // 检测编译运行环境
        if(checkEnvironment()) {
            logger.info("编译器环境配置正常");
        }else {
            logger.severe("编译环境配置不正确，请在config.properties中配置好正确的编译环境");
        }

        // 组合命令行编译指令 放在 DefaultCLICompiler 中完成的
		m_CLITemplate  = new DefaultCLICompiler(sourceFile);
		logger.info("编译指令："+m_CLITemplate.getCommand());
        // 编译指令执行生成可执行文件
		m_CLITemplate.compile(m_CLITemplate.getCommand());
		logger.info("生成可执行文件：" + m_CLITemplate.getOutputDir()+""+(sourceFile.getName().length()-3)+".exe");

        // TODO 生成测试用例
//        m_TestCaseGenerateStrategy.generate();

        File infile = new File(this.getClass().getResource("/1004_in001.txt").toURI());
        TestCase testCase = m_InputOutputFormat.read(infile);// 读取测试数据
        m_InputOutputFormat.writeTo(testCase);
        // 测试用例 输出写入到文件
        String outputData = (String) testCase.getOutMap().get("outputData");
        File outfile = new File(this.getClass().getResource("/").toURI().toString().substring(6)+"1004_out001.txt");
        outfile.createNewFile();
        FileOutputStream fos = new FileOutputStream(outfile); // 写出测试数据
        fos.write(outputData.getBytes());
        fos.flush();
        fos.close();

	}

	/**
	 * 测试测试用例
	 */
	public void testTestCases(){

	}

    /**
     * 检测编译运行环境
     */
	public Boolean checkEnvironment() {
	    return true;
	}

	public void setCorrectCppSourceFile(String sourceFile) {
	}

	public void setInputOutputFormat(InputOutputFormat inputOutputFormat) {
	    this.m_InputOutputFormat = inputOutputFormat;
	}

	public void setOutputDirectory(String outputDirectory) {
	}
}